home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
graphics
/
qrt.lzh
/
RELPOS.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-02-16
|
3KB
|
118 lines
/**********************************************************
Relative position module. This is used for patterns:
when an object intersection is found, its location is
passed to one of these routines, which returns two
object-relative coordinates.
**********************************************************/
#include "qrt.h"
/* #define RELPOSDEBUG 1 */
/**********************************************************
Finds relative coords on plane given position in space.
object should be parallelogram or ring.
loc is point in space.
pos1, pos2 are set to relative coords.
**********************************************************/
Plane_Pos(obj,loc,pos1,pos2)
OBJ_PTR obj;
VECT_PTR loc;
float *pos1, *pos2;
{
VECTOR delta;
register float len1, len2;
# ifdef ROBUST
if (!((obj->type == RING) ||
(obj->type == PARALLELOGRAM) ||
(obj->type == RING) ||
(obj->type == TRIANGLE)))
Error(INTERNAL_ERROR,701);
# endif
VecSubtract(&delta,loc,&(obj->loc));
len1 = sqrt(DotProd(obj->vect1,obj->vect1));
len2 = sqrt(DotProd(obj->vect2,obj->vect2));
*pos1 = DotProd(delta,obj->vect1)/len1;
*pos2 = DotProd(delta,obj->vect2)/len2;
# ifdef RELPOSDEBUG
printf("PLANEPOS: len1,2 = %f %f\n",len1,len2);
printf(" pos1,2 = %f %f\n",*pos1,*pos2);
# endif
}
/**********************************************************
Finds relative coords on sphere given position in space
obj->vect1.x = radius of sphere
**********************************************************/
Sphere_Pos(obj,loc,pos1,pos2)
OBJ_PTR obj;
VECT_PTR loc;
float *pos1, *pos2;
{
float atan2w();
VECTOR delta;
# ifdef ROBUST
if (obj->type!=SPHERE) Error(INTERNAL_ERROR,702);
# endif
VecSubtract(&delta,loc,&(obj->loc));
# ifdef ROBUST
if (delta.x==0 && delta.y==0 && delta.z==0)
Error(INTERNAL_ERROR,703);
# endif
*pos1 = atan2w(delta.x,delta.y) * obj->vect1.x;
*pos2 = atan2w(sqrt(sqr(delta.x)+sqr(delta.y)),delta.z) *
obj->vect1.x;
# ifdef RELPOSDEBUG
printf("SPHEREPOS: pos1,2 = %f %f\n",*pos1,*pos2);
# endif
}
/**********************************************************
Finds relative coords on quadratic given position in space
**********************************************************/
Quadratic_Pos(obj,loc,pos1,pos2)
OBJ_PTR obj;
VECT_PTR loc;
float *pos1, *pos2;
{
VECTOR newpos;
VecSubtract(&newpos,loc,&(obj->loc));
*pos1 = newpos.x; /** This isn't right! **/
*pos2 = newpos.y; /** fix it later **/
# ifdef RELPOSDEBUG
printf("QUADRATICPOS: pos1,2 = %f %f\n",*pos1,*pos2);
# endif
}